/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pr2.cruce;

import java.util.Collections;
import java.util.List;
import pr2.cromosoma.CromosomaPVC;

/**
 *
 * @author Gonzalo Ortiz Jaureguizar (gortiz at software.imdea.org)
 */
public class CrucePropio extends EstrategiaCruce<CromosomaPVC>{

    public CrucePropio(int size) {
        super(size);
    }

    public CrucePropio() {
    }

    @Override
    protected void cruzar(CromosomaPVC p1, CromosomaPVC p2, CromosomaPVC h1, CromosomaPVC h2) {
        //en un principio padres e hijos iguales
        Collections.copy(h1.getGenes(), p1.getGenes());
        Collections.copy(h2.getGenes(), p2.getGenes());

        int posInicial = (int) (Math.random() * p1.getGenes().size());
        mezclar(p1.getGenes(), p2.getGenes(), h1.getGenes(), posInicial);
        mezclar(p2.getGenes(), p1.getGenes(), h2.getGenes(), posInicial);
    }

    private void mezclar(List<Integer> p1, List<Integer> p2, List<Integer>h, int posInicial) {
        int pos = posInicial;
        boolean iniciando = true;

        while(pos != posInicial || iniciando) {
            iniciando = false;
            //miramos que tiene el otro padre en esa posicion
            Integer otro = p2.get(pos);
            //ponemos en esta posicion lo que tiene el otro padre
            h.set(pos, otro);
            //ahora podria haber repeticiones, por lo que buscamos donde esta
            //(en el padre viejo) el valor "otro"
            pos = p1.indexOf(otro);
            /*
             * ahora pueden pasar dos cosas:
             *      + o bien pos == posInicial => hemos alcanzado un ciclo y finalizamos
             *      + o bien pos != posInicial => repetimos el paso
             */
        }
    }

}
